package nextel.ruta;

import nextel.ruta.bean.RutaBean;
import nextel.ruta.bean.RutaPorCodigoBean;
import nextel.ruta.bean.RutaPorNombreBean;
import nextel.ruta.mvc.MVCRutaBusqueda;
import nextel.ruta.mvc.MVCRutaDetalle;
import nextel.ruta.mvc.MVCRutaResultado;
import nextel.ruta.mvc.MVCRutaResultadoRuta;

import nextel.ruta.rms.RMSRuta;
import nextel.ruta.rms.RMSRutaPorCodigo;
import nextel.ruta.rms.RMSRutaPorNombre;
import nextel.usuario.ControlUsuario;
import nextel.visita.ControlVisita;
import pe.com.nextel.idioma.IdiomaManager;
import pe.com.nextel.main.ControlBase;

public class ControlRuta extends ControlBase {
    
    private static final ControlRuta control = new ControlRuta();
    public RutaBean currentRuta;
    public final RMSRuta rmsRuta = new RMSRuta();
    public final RMSRutaPorCodigo rmsRutaPorCodigo = new RMSRutaPorCodigo();
    public final RMSRutaPorNombre rmsRutaPorNombre = new RMSRutaPorNombre();
    
    public final MVCRutaBusqueda mvcRutaBusqueda = new MVCRutaBusqueda();
    public final MVCRutaDetalle mvcRutaDetalle = new MVCRutaDetalle();
    public final MVCRutaResultado mvcRutaResultado = new MVCRutaResultado();
    public final MVCRutaResultadoRuta mvcRutaResultadoRuta = new MVCRutaResultadoRuta();
    
    public Thread threadBusqueda;
    
    /**
     * metodo de acceso para instanciar los recordStored
     */
    public static ControlRuta getInstance() {
        return control;
    }
    
    /**
     * para no crear mas instancias
     */
    private ControlRuta() {
    }
    
    public void joinThreadBusqueda() {
        try {
            if (threadBusqueda != null && threadBusqueda.isAlive()) {
                threadBusqueda.join();
            }
        } catch (Exception e) {
        }
    }
    
    /*****************************************************************************/
    /********************LOGICA DE NEGOCIO **************************************/
    /*****************************************************************************/
    /********************************/
    /* CLIENTES
    /********************************/
    public void limpiarMemoria() {
        
        if (currentRuta != null) {
            currentRuta.clear();
            currentRuta = null;
        }
        
        System.gc();
    }
    
    public void buscarPorCodigoRuta(String codigo) {
        //#debug
//        System.out.println("0. ControlRuta.buscarPorCodigoRuta");
        try {
            
            RutaPorCodigoBean rutaPorcodigo = rmsRutaPorCodigo.buscarRuta(codigo);
            if (rutaPorcodigo != null) {
                RutaBean ruta = (RutaBean) rmsRuta.getObject(rutaPorcodigo.getIdRecordRuta(), rutaPorcodigo.getPosRecordRuta());
                currentRuta = (ruta);
                ControlVisita.getInstance().currentEstado = ControlRuta.getInstance().currentRuta.getEstadoActualSiguiente();
                
                if(ControlVisita.getInstance().currentEstado != null){
                    setCurrent(mvcRutaDetalle);
                }else{
                    showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ACTIVIDAD_COMPLETA), mvcRutaBusqueda.showScreen());
                }
                
            } else {
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NO_ENCONTRARON_RESULTADOS), mvcRutaBusqueda.showScreen());
            }
        } catch (Exception e) {
            e.printStackTrace();
            if (e.getMessage().equals("Sincronizar")) {
                showError(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_DEBE_SINCRONIZAR), mvcRutaBusqueda.showScreen());
            } else {
                showError("Error : " + e, mvcRutaBusqueda.showScreen());
            }
        }
    }
    
    public void obtenerRutaPorNombre(RutaPorNombreBean rutaPorNombre) {
//        System.out.println("0. ControlRuta.obtenerRutaPorNombre");
        
        try {
            RutaBean ruta = (RutaBean) rmsRuta.getObject(rutaPorNombre.getIdRecordRuta(), rutaPorNombre.getPosRecordRuta());
            currentRuta = (ruta);
            ControlVisita.getInstance().currentEstado = ControlRuta.getInstance().currentRuta.getEstadoActualSiguiente();
            if(ControlVisita.getInstance().currentEstado != null){
                setCurrent(mvcRutaDetalle);
            }else{
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ACTIVIDAD_COMPLETA), mvcRutaBusqueda.showScreen());
            }
            
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, mvcRutaBusqueda.showScreen());
        }
    }
    
    public void buscarPorNombreRuta(final String nombre) {
        //#debug
//        System.out.println("0. ControlRuta.buscarPorNombreRuta");
        
        try {
            
            joinThreadBusqueda();
            setCurrent(mvcRutaResultado);
            threadBusqueda = null;
            threadBusqueda = new Thread() {
                
                public void run() {
                    try {
                        
                        rmsRutaPorNombre.buscarPorNombreRutas(nombre, mvcRutaResultado);
                        
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            threadBusqueda.start();
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, mvcRutaBusqueda.showScreen());
        }
    }
    
     public void buscarNOVisita() {
        //#debug
//        System.out.println("0. ControlRuta.buscarNOVisita");
        
        try {
            
            joinThreadBusqueda();
            setCurrent(mvcRutaResultadoRuta);
            threadBusqueda = null;
            threadBusqueda = new Thread() {
                
                public void run() {
                    try {
                        
                        rmsRuta.buscarNOVisita(  mvcRutaResultadoRuta);
                        
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            threadBusqueda.start();
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, mvcRutaBusqueda.showScreen());
        }
    }
    
    
    
    
    public void obtenerRuta( ) {
//        System.out.println("0. CONTROLRUTA.OBTENER RUTA ");
        
        try {
            
            limpiarMemoria();
            ControlVisita.getInstance().currentEstado = null;
            ControlVisita.getInstance().limpiarMemoria();
            
            if(validarSiTieneEstadoPendiente()) {
                setCurrent(mvcRutaDetalle);
                
            }else{
                joinThreadBusqueda();
                setCurrent(mvcRutaResultadoRuta);
                
                threadBusqueda = null;
                
                threadBusqueda = new Thread() {
                    
                    public void run() {
                        try {
                            
                            rmsRuta.buscarPorRutas(mvcRutaResultadoRuta);
                            
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };
                
                threadBusqueda.start();
            }
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, mvcRutaBusqueda.showScreen());
        }
    }
    
    public boolean validarSiTieneEstadoPendiente(){
        
        try{
            currentRuta = null;
            ControlVisita.getInstance().currentEstado = null;
            
            if(ControlUsuario.getInstance().currentUsuario.idRecordRuta > 0){
//                System.out.println("idRecordRuta|posicionRuta=" + ControlUsuario.getInstance().currentUsuario.idRecordRuta + "|"+ ControlUsuario.getInstance().currentUsuario.posicionRuta);
                currentRuta  = (RutaBean) rmsRuta.getObject(ControlUsuario.getInstance().currentUsuario.idRecordRuta, ControlUsuario.getInstance().currentUsuario.posicionRuta);
            }
            
            // si no visita no sale
            if (ControlRuta.getInstance().currentRuta != null && ControlRuta.getInstance().currentRuta.noVisita == 1){
                currentRuta = null;
            }
            
            if(ControlRuta.getInstance().currentRuta != null ){
                ControlVisita.getInstance().currentEstado = ControlRuta.getInstance().currentRuta.getEstadoActualSiguiente();
            }
            
            if(ControlVisita.getInstance().currentEstado != null){
                return true;                                     
            }else{                                               
                return false;
            }
            
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
        
    }
    
    public void eliminarDatos() throws Exception {
        rmsRuta.deleteAll();
        rmsRutaPorCodigo.deleteAll();
        rmsRutaPorNombre.deleteAll();
    }
    
    public void actualizarRuta(RutaBean bean) throws Exception {
        rmsRuta.actualizarObjectLista(bean);
    }
}
